{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define model and Loss\n",
    "\n",
    "class Model(object):\n",
    "    def __init__(self):\n",
    "        self.W = tf.Variable(10.0)\n",
    "        self.b = tf.Variable(-5.0)\n",
    "\n",
    "    def __call__(self, inputs):\n",
    "        return self.W * inputs + self.b\n",
    "\n",
    "def compute_loss(y_true, y_pred):\n",
    "    return tf.reduce_mean(tf.square(y_true-y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define True weight and bias\n",
    "\n",
    "TRUE_W = 3.0\n",
    "TRUE_b = 2.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Obtain training data, Let's synthesize the training data with some noise.\n",
    "\n",
    "NUM_EXAMPLES = 1000\n",
    "inputs  = tf.random.normal(shape=[NUM_EXAMPLES])\n",
    "noise   = tf.random.normal(shape=[NUM_EXAMPLES])\n",
    "outputs = inputs * TRUE_W + TRUE_b + noise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Before we train the model let's visualize where the model stands right now.\n",
    "# We'll plot the model's predictions in red and the training data in blue.\n",
    "\n",
    "def plot(epoch):\n",
    "    plt.scatter(inputs, outputs, c='b')\n",
    "    plt.scatter(inputs, model(inputs), c='r')\n",
    "    plt.title(\"epoch %2d, loss = %s\" %(epoch, str(compute_loss(outputs, model(inputs)).numpy())))\n",
    "    plt.legend()\n",
    "    plt.draw()\n",
    "    plt.ion()\n",
    "    plt.pause(1)\n",
    "    plt.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Logging before flag parsing goes to stderr.\n",
      "W0308 18:57:55.500271 4321252224 legend.py:1289] No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=> epoch  1: w_true= 3.00, w_pred= 8.67; b_true= 2.00, b_pred= -3.62, loss= 96.15\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEICAYAAABcVE8dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xt0XWd55/HvI1mKJTvFiewysR3JaUkpNk0pMfQCdOjIJcHTktIprKRyMAks1xJtw5pOKaDVNnTGa8rQYdXt4IBXyVUHQqYpU2AMDU7LUOgEMDSluRDIFMtxAo3t3OzIiS965o93b7R1dC5773M/5/dZay+fc/bt3VLynEfPfvf7mrsjIiLdr6/VDRARkeZQwBcR6REK+CIiPUIBX0SkRyjgi4j0CAV8EZEeoYAvDWdmG8zMzWxZC859vZnNNPu8Iu1IAV/anpm92cz+wczmzOwLrW5PI5jZGjP7mJk9bWZPmlkhse5PzOw7ZnbczL5lZm+pcqzfMrPvmtkzZnbAzF5dtP7lZvZFMzthZv9qZtcl1h00s5PRuhNmdldinZnZfzGzR6N2fsHMNiXW35/Y74SZnTGzT9fnJyT1oIAvneAJ4E+BP251Qxror4DvA6PADwN/klj3LPDLwAuA7cBuM/u5Ugcxs58m/Jx+Ldr+o8Anzaw/Wr8a+BzwEWAEeBFwV9FhftndV0bL6xKfvwm4FngNcD7wf4Hb4pXuvineDzgXeAT4nxl/DtJACvg9yMzWmtmdZnYkygR/O7HuejP7SzP7RJRRfsPMfjKx/iVRZvdUlNG9IbFuyMz+u5nNRhngl8xsKHHqCTM7ZGZHzWw6bXvdfb+73wE8Vodrf0PU7qei63hJYt3vRdnrcTN7yMzGo89fGWXKz0QZ8QdrbUdRm14HXAj8rrs/7e6n3f0f4/Xu/ofu/i13n3f3rwB/D/xsmcNtAO539697eIz+VmA14UsE4D8Cf+PuBXd/3t2Pu/uDKZt6EfAld/8Xdz8LzAAby2z789F570x5bGkCBfweY2Z9wKeBfwLWAePAO83sssRmVxAys/OBjwH/y8wGzGwg2vcuQgD5LaBgZi+O9vsT4FLg56J93wXMJ477auDF0Tn/IBlsm8HMfgz4OPBOYA2wD/i0mQ1G1/CbwCvc/VzgMuBgtOtuYLe7/xDwo8AdZY4/Gn2RlFt+vUzTfgZ4CLjFzI6Z2dfM7N+WOccQ8Arg/jLH+izQb2Y/HWX11wL3Ev56iM/1RFQie9zMPm1mo0XHKETJwF3JL3vgduBHzezHov8WthP+WihlO3Cnuz9bZr20grtr6aEF+GngUNFn7wFuil5fD9yTWNcHfI/wZ/xrCIGjL7H+49E+fcBJ4CdLnHMD4MD6xGdfBa7M2Pa3A1/IuM/1wEz0+veBO4qu7VHgtYTSxuPAFmCg6BhfBN4HrG7Q72Rv9PN5GzAAXAk8Vep8wC2EIGtljmXAe4HTwBngKOFLLF7/7ejYrwCWA38GfDmx/lXAEDAc/XfxfWBVtG6Q8OXn0bG/C1xUog3DwDPAa1v937uWxYsy/N4zBqxNZp6EAPHCxDaPxC/cfR44DKyNlkeiz2KzhL8UVhMCyP+rcO7vJ17PAStruZAc1hLaC/zg2h4B1rn7w4TM/3rgcTO73czWRpu+Dfgx4FtR9v1LdW7XSeCgu3/UQznn9qhdr0puZGYfAF4KvNmjyFrC24BrgE2EAL0N+EziWk4Cn3T3r7n7c4Qvsp8zsxcAuPuX3f2ku8+5+38lfDm8Jtr3DwhfFBcSftfvA/7WzIaL2vCrhPsu/yfPD0MaRwG/9zwCfNfdVyWWc919a2KbC+MXUQloPaF+/hhwYfRZbJSQJR8FniOUPNrVY4QvPCD0OiFc66MA7v4xd391tI0D748+/467X0UoY70f+EszW1F88Kikc6LCMlGmXd+Mzpe06L2ZvQ94PfA6d3+mwjW+DPiMu3/bQ83/c4S/0OKbvMXnqjZcrhP+aoiP/Ql3P+zuZ9z9ZuA8ltbxtwO3VvhSkhZRwO89XwWORzcoh8ys38xeamavSGxzqZn9qoV+8+8EngfuAb5CyMzfFdX0X0voPXJ7lC3fCHwwuincb2Y/a2bn1Nrg6FjLgWVAn5ktj2rI8fqDZvbWFIe6A/j3ZjYe7f870bX9g5m92Mz+XdTe5wiZ8Hx0/G1mtia6xqeiY80XH9zdD/lC75ZSS6F4n8gngfPMbHt0rb9G+JL9cnT+9wC/Dmxx92NVrvFr0TX+iAW/SPjr5L5o/U3AG83sZdHP4PcJN2Kfjr6wXhXd01huZr9L+Mvty4ljv8nMXmhmfWZ2NaEE9XB8cjNbD/wCofQk7abVNSUtzV8IpY2PE0osTxKC+ZZo3fXAXwKfAI4D/wi8PLHvJsKf6k8DDwBvTKwbInSffDRa/8Xosw2ETHFZYtsvAG9P2d63Rvsnl5ujdYNRO3+8zL7XE9Xwo/dvjNr9dHQdm6LPLyH6MiSUIz4DrI3WzRDq+ycIN0t/pQG/k9cA/xyd4wDwmsQ6J3wxnUgs702sPxFvT8jG/wg4FF3Lg8DVReeajH5HTxJuwl+Y+N1+k9AN9BhwN7A5sd9y4EOEvxieAb4BXF507PcAf9/q/8a1lF4s+iWJAKFbJvAid9/W6rakYeGhond4KLmISAVNf9RdpJ7c/UvAl1rdDpFOoBq+iEiPUElHRKRHKMMXEekRbVXDX716tW/YsKHVzRAR6Shf//rXj7r7mmrbtVXA37BhAwcOHGh1M0REOoqZzVbfSiUdEZGeoYAvItIjFPBFRHpEW9XwRUR63enTpzl8+DDPPffcknXLly9n/fr1DAwMlNizOgV8EZE2cvjwYc4991w2bNhAGNA1cHeOHTvG4cOHueiii3IdWyUdEZE28txzzzEyMrIo2AOYGSMjIyUz/7QU8EVEmq1QgA0boK8v/FtYPHJ2cbCv9nlaKumIiDRToQA7dsDcXHg/OxveA0yUmyOnPpThi4g0Q5zVb9u2EOxjc3MwPd3wJijDFxFptOKsvpRDh37w0t1Llm9qHexSGb6ISKNNT1cO9gCjo0Doenns2LElwT3upbN8+fLczVCGLyLSaInsvaThYdi1C4D169dz+PBhjhw5smSzuB9+Xgr4IiKNNjoabs6WMjYWgn10w3ZgYCB3P/tqVNIREWm0XbtCFp80PAwzM3DwYMN758QU8EVEalGlTz0QAvrevSGbNwv/7t3btEAfU0lHRCSvLH3qJyaaHuCLKcMXEcmrVO+bJvWpz0MBX0Qkr3K9b6r1ymkRBXwRkbyivvOpP28xBXwRkbzK9b6J+tS3GwV8EZG82qT3TVo199IxswuBW4EXAg7sdffdZnY+8AlgA3AQeLO7P1nr+URE2kob9L5Jqx4Z/hngd9x9I/AzwDvMbCPwbuBud78YuDt6LyIiLVJzwHf377n7N6LXx4EHgXXAFcAt0Wa3AL9S67lERCS/utbwzWwD8FPAV4AXuvv3olXfJ5R8Su2zw8wOmNmBUoMFiYhIfdQt4JvZSuBO4J3u/kxynYdxPksO5Ozue919s7tvXrNmTb2aIyIiReoS8M1sgBDsC+7+V9HH/2pmF0TrLwAer8e5REQkn5oDvoVpWT4KPOjuH0ys+hSwPXq9HfjrWs8lIiL51WPwtFcBVwP/bGb3Rp+9F/hj4A4zexswC7y5DucSEZGc6tFL50vubu5+ibu/LFr2ufsxdx9394vdfYu7P1GPBouI5FIowLnnhgekzMJwxlNTrW5VU2l4ZBHpfoUCvPWtcObMwmfucMMN4fWePS1pVrNpaAUR6V7x5CTbti0O9kl79za1Sa2kDF9EutPUFHz4wyGTr+Ts2ea0pw0o4ItIdykUYOdOOHEi3fb9/Y1tTxtRwBeR7lEowLXXwqlT6feJpyTsAQr4ItI9pqfTB3uz8JdAj9ywBQV8Eekm1aYWNIPbbuuY4YzrTb10RKQzxT1w+vrCv4VC9akFd+7s2WAPCvgi0mkKBVi5MnS1nJ0NvXBmZ0MtfutWGBwsvd/kZE+Vb0pRwBeRzjE1FQL9s88uXTc3B/v2wY03wsjIwucjIzAz0/PBHlTDF5FOMTW18GRsOYcOddSUg82mDF9E2l+hEB6iqqZaDb/HKeCLSPubnq7+xKwZ7NrVnPZ0KAV8EWkvpXrfVOtuCT3fAycN1fBFpH1s2QJ3373wfnY2PDl7/vlw7Fj5/dQDJxVl+CLSHqamFgf72KlT8NxzMDy8dN2KFeqBk4ECvoi01tQULFtWuQfOs8+GYYzHxkKtfmwsBPoTJ1TGyUAlHRFpnTRdLWPqblkzZfgi0nyFAqxenT7YJx+kktyU4YtI8xQK8Pa3h5p8Frt3N6Y9PUYZvog0RzwsQpZgH9+UVSmnLhTwRaSxpqbCjda05RsI3SzddVO2zhTwRaQx4lEtswR66Lg+9aWeE2vEPvWgGr6I1F/xA1RpDAzATTd1VEZfKIRRmefmwvt4lGYofxl59qkX82rjUzTR5s2b/cCBA61uhojkVSjA9u1w9my2/QYHw7DGHRTsIWTns7NLPx8bg4MH67dPNWb2dXffXG07lXREpD7im7JZg/3kJDz/fMcFeyg/xE+loX/y7FMvKumISG3ylG8Axsdh//76t6eJRkdLZ+uVRmnOs0+9KMMXkfw2bcoX7CcnOz7YQxiNuXiIn+Hh0qM0xzdqZ2dDp6U0+9RbXQK+md1oZo+b2X2Jz843s8+b2Xeif8+rx7lEpE1s2QIPPJB++/Hx0NXSvWW9cOrdO2ZiYukQP3v3Lq1OxTdq48zefSHol9unIdy95gX4eeDlwH2Jz/4b8O7o9buB91c7zqWXXuoi0ubWro3Ddvpl48a6nHpmxn1szN0s/Dszk367mRn34eHFzRoeLn+MehobK/1jGRurz/GBA54mVqfZKNWBYENRwH8IuCB6fQHwULVjKOCLtLHx8eyBPmOwrxTQSwVss4XAGW9bLrCPjDQ26FYSt7N4MavP8dsh4D+VeG3J90X77QAOAAdGR0frc/UiUl+rVuUL9pOTSw5VLqhXy8DLZcnF21bbrlFBt5JeyPCfKlr/ZLVjKMMXKS9tOaOu6pzVVwrq1YJiuSy5eNs02zU7w290OakdAr5KOiJ10pL689BQvmA/Pl72kJWCerWyR7mSTPG2WTJ8syZ9cXpjv7DTBvxGdsv8FLA9er0d+OsGnkukq01PLzyKH5ubC59nVbWnSqEQVp48me3A8YBnRd0tk+cr1f8cwuchN1xqdDQc4/jx6k0YHS3dVbIc9+Y97zUxEZ6knZ8P/7bkObM03wrVFuDjwPeA08Bh4G3ACHA38B1gP3B+teMowxcprV43/ar+pbBxY+aMfh785hWTbhay8JER/8HrlSvz/ZGQvL7JyXRZ++Dg4vsBaY4/MlLP31LrkDLD11g6Ih2gXuOvlDvOA/2beMnZDH3qgThyfNgmmfLG9asfHl76100pIyNw9OjC+9Wr4dixyvt04HhtJWksHZEukuWJzkpKjdfyNMP8eIZg79HyTTbShzc02EMI9v391bd74omF14UCPPNM9X1On85XFutUCvgiHSDLE51xvXz16rAka/XJ8Vr+nCnmMc7lJEVP+pflwHGG6MN5GffX5+JSOHu2el0+eW3T0yGYp9GMQcvahQK+SIcovukHi4P7ypVhsMr4BuixY2FxXxhzfevWEDgf5zzewQ0YpAr2DswDH2KSF5CivlJn8RdcuUzfbPFfO1mCeDMGLWsXquGLdJhCAa67rnp9upR/YhM/QSjfZMnqD7GWDTya/YR1Ek9r29dXvjdP8vNy9yrMFm83PNzEcWwaSDV8kTaWZRCv4jLNtddmD/Zx+eYneCBTVh/X6lsZ7EdGFgJyuWx8bGzx+3L3PHburF4W62ppuvI0a1G3TOkFWR6iKrVt1uUga30+R1fLpxmq6bx5u2FW+rmk+dkln9rt7w//Nu3J5BahDR68EpESsjxEVWrbLO5lE6M8lql8cxZjgpmW1OpXrAhLbGho8fpqN6+LhyGOb/bu2tVjmXwZquGLNFmlOnRsxQpYvjxfnR7gc2zhdYSJSbIE+6Os4od5Mt9JGyRLnb0R88V2AtXwRdpUml4hzz6bL9h/ji3MY7yOuzPX6u9ivO2CPWQbQqKV88V2AgV8kRpVugFbal2WsV6yeJzzMgV6WOiB04dzOe075WDagF3uy7SXul5WoknMRaooFEKGeegQnH8+PP88nDgR1q1YER7wOXUqvI/7u8d27Fiowc/Ohn7y9XYVBWbYljnQz2NczW18nPYvbqcN2Lt2Lf6ZQ/Pmi+0Iae7sNmtRLx2pt1qHpM3bS2ZsLPtEHHmWe9mYqwfOQdY2vQcOhMHKBgez7ZN1GOiWzBvQYjR7PPx6LAr4Uk+1jCGfZ+akZi6fY9zno+CdJdCfxvwqZlrS5nhkz+KAHI+GWe59LwTsWqUN+OqlI10rb4+NuGtfLd0hG+lZBhnidOryDdAWT8t2e0+ZVlIvHel5aXpsFArh6VWzsPT3hzp7Owb7+GnZLMHeCWPgTDDTtGDf1weDg4s/Ux29PSjgS1co1Rum3I2+889f2OeaaxZ3f5yfb3RL88kz2Fmc1ffjNd2YtZTfLvGDULfeCjfe2ONDGLSrNHWfZi2q4UtWMzOl5zodHg614L6+yjXlVtfiqy3xTdmstfpTULe6e/GwBfFwBfHS3686e6uhoRWkW8XZvBlcfXXpB5Tm5kKmWSljb6PbVyWdxrgk52Bng9R+cWZhsLFkZj4xAbfcsjh7v+UWZe+dQv3wpaMU31CtFLSffbY5baq3vMMinGSAFZyq6dwrVoSfbTwZeKlAPjGhAN+plOFL20tm9O16Q7UerqLA2RqGRUgb7IeHw/jyk5MLE4r094f3J04sTLCioN59lOFLW2v3LpL1krerZdasfmQEdu9eyNL3NHY6WmkzyvClbRRP9BFP2dftwf50jq6WcQ+ctMF+bCxk9UePKnPvZcrwpS0UZ/J5hwXuJPeyiUtyTDd4nCE+PTPH1VdHH1TR16cHniRQhi8t0yu1+WJxrT5PD5x4EvHp6fQDiv3Gb+Rvq3QXBXxJJcscrGlMTYUulaWGPuhmn2MLBbbRR9aRLaEP57cIRfdDh0oPs7xs2cKDUvGNWNXpJaaAL1Ulp41zXxgCOE3QT2bxcTA65xy44Yb27wdfT1dRWDQxSRrJHjjLimo3o6Olp/u7+ebQy8YdzpxRsJfFNHiaVFVuELKRkXBjNR4nHuCJJxb6cENv9LCpJmsPnPj/yLsYLzkpSZYp/6Q3aPA0qVmcnZcruxw7tpD1HzsWluRfANdd19vBPp5uME8PnI/NOL8xth+z8MU6MqJxaaR2DQ/4Zna5mT1kZg+b2bsbfT6pLk09PlnGyWNurjd62pTzLIO5phs8C/zImDMxEXrWzM+HrpRHj+qBKKldQwO+mfUDHwJeD2wErjKzjY08p1SWph5fKMD27b2dnecV1+rzZPUfYpIBXBNuS8M0uh/+K4GH3f1fAMzsduAKiDofS9NNTy8N5HNzofwyPR2+AMx664ZqFitWwFveEm46F8v7tOxxhngBC78UTbgtjdLoks464JHE+8PRZz9gZjvM7ICZHThy5EiDmyPlsse4Hg8K9qUkx5rZsye8jh1kXeasHkKwv3ZgZlGw10Qh0kgtv2nr7nvdfbO7b16zZk2rm9PR0tTmlT2mNzIShiMo1cVxz56w7iSDjPJYplo9AAMDmDtbbprQRCHSNI0O+I8CFyber48+kzorV5ufmlr8JbB169KHdWTBsmULQb7iuDNbtjCxzVieMasHwglOhTFwkjdndUNWGq2h/fDNbBnwbWCcEOi/Bvy6u99fanv1w8+vUvfJpL4+GBrq3LHiG21kJAT6itLO+VdsaEh3wqUh2qIfvrufAX4T+BvgQeCOcsFeKitXrpmaCvXltN0n5+cV7Ct54okKKwuF/MF+ZkbBXlqu4aNluvs+YF+jz9PNikeSjMs1N90Ed9/d2rZ1kjS9j0re4ygUwuhueekuuLSJlt+0lerKdaVUsK+uv3/hhujOnZXvX5TsIdPfnz/YxzcDRNqEAn4H0IM41fX3w+Dg4s+Gh8ME2/EN0T17Fg82VnHIgrh8U2kW9HLWrg2BXndgpc0o4HeAeGCybjQ2FmKjO4yP5ztGf38I7DfeSNUujqmGLJiayp/Vu8Oj6ogm7UkBv4UKhTCVn1lYVq9efDM2Hk64m8ekSf71sn9/9qAfZ/HxHK01dXGMs/pSj9FWE2f1Im1MAT+jek0EUijANdcsDubHjoXEMo45Z8/Wo8Xtrfgm6f79Cxn/zMzSmvvAQINGjly3Tlm9dD0F/AxqmQik2HXXwenT9W9jJ6k2jECpCT5uuqnOI0fGWf1jj2Xfd3JSWb10FE2AkkG5h5vGxipPEl0ohJ42hw6FjHbr1nxVg24yNhaCfUvva/b357spCwr00lba4sGrblOut0ylXjSl/irotmC/YsXS55EGB0P5JclsISlu6TACU1P5e+AMDSnYS8dSwM+g3MBj7uXr+aX60Hea4eFQTy9VUx8eho98BG67bXHp5cYbQ/kl+dltt7XBHKvDw/m+cfv6wi+603+Z0tvcvW2WSy+91NvRzIz72Fi4lWgW31JcugwPh22TKm3fjouZ+8hIWMzCdSevKf5ZlFrX1sbH8/9QNm5sdetFKgIOeIoYqxp+FcXDGkDlR/TjsnA8kXc8qUgjxO2I6+G1nivVwGGd6Lzz4Kmnsu/X19cbXaWk46mGXyelSjKVviPPnl3cg2fr1vzjbZUSHysukSTr4bt2pRv6eNmyEMuSBgZg9+76tbMtbNkSfmB5gv3kpIK9dB0F/DLi/va1ZMxzc7BvXxjDJa1SN0ArBfmkUt0YJydD5h4bGYGbb4Zbb13a3bGrRgIYHMw32NCqVeEH3PKbDSINkKbu06yl1hp+sr5cqQ6d5jjDw/Wribun2za+B5C1Tt6xdfVGqKVW39M/OOlkpKzhtzzIJ5daAn61IF3qhmo58Q3aeixjY+GYIyONiTelrjvLtXaVVavy/ZKGhlrdcpGapA34XVPSqdb9cW4ubJNGntEpS/U7Tz5Junv30vVJY2P5Sirlhk5Oe61dYdOm2mr16mopPaJrAn6aIJ02kKeZ6Lt4TJdS/c6T47xMTIT1yXp6rNoQA5XkeRisq5jBAw9k3y8e7Ey1eukhXRPw0wTpctsUD4hWaqLvwcHFAb7UmC7VRmucmAj7zMxUH8Y3rXLXlObn0dHirD6PyUkNdia9KU3dp1lLK2r45Wrgk5OdcSO0J2v4eoBKZBFS1vAbPqdts8QZcjxIWTxpyBNPLDwEVSqLLlcD37ev8oBo7aL4uitda8cbHoaTJ/Pt617ftoh0oJ5/0jYeIqVY3rG1pAFqmUR87VqVb6TrpX3Stmsy/LxGR0s/XNX1NfBOsW5dvrHqh4bU+0akSNfctM2r1HAEtfSakTrKOzHJ+LiCvUgJPZ/h91QNvFNoYhKRhuj5DB/qMPm11EctE5Ns3KhgL1JFz2f40iY2bcr3AJWGMBZJTRm+tFac1ecJ9uPjCvYiGSjDl9YZHITTp/Ptq/KNSGY1Zfhm9iYzu9/M5s1sc9G695jZw2b2kJldVlszpeuY5Qv2mkRcJLdaSzr3Ab8KfDH5oZltBK4ENgGXA3vMrL/Gc0k3GBzMNwZOPDGJuluK5FZTwHf3B939oRKrrgBud/fn3f27wMPAK2s5l3S4QiF/Vj8zA08+Wf82ifSYRtXw1wH3JN4fjj6TXpS3B46elhWpq6oZvpntN7P7SixX1KMBZrbDzA6Y2YEjR47U45DSLuKsPk+w18QkInVXNcN39y05jvsocGHi/fros1LH3wvshTB4Wo5zSTvKm9VrsDORhmlUP/xPAVea2TlmdhFwMfDVBp1L2kkt/erdFexFGqimGr6ZvRH4c2AN8L/N7F53v8zd7zezO4AHgDPAO9xdT8h0u7z96jduhPvvr397RGSRWnvpfNLd17v7Oe7+Qne/LLFul7v/qLu/2N0/W3tTpW3F0w3m7YGjYC/SFHrSVmqTd15Z1epFmk5j6Ug+ca0+j5kZBXuRFlCGL9mpB45IR1KGL+nV0q9eWb1IyynDl3Q0t6xIx1OGL5UVCrBsWfZgPzCgwc5E2owCvpQW35Tdti37JCOTk3DqVGPaJSK5qaQjS513Hjz1VPb9BgYU6EXamDJ8WRBn9XmC/fi4gr1Im1OGL0HerparVmmsepEOoQy/1+Xtatnfr4lJRDqMMvxeNjUFN9yQfb/xcdi/v/7tEZGGUsDvRYUCbN+evfcNKNiLdDAF/F6Tt1avQC/S8VTD7yXr1uWfblDBXqTjKcPvBVu2wN13Z99Pg52JdBVl+N0s7oGTNdivXavpBkW6kDL8bpV3sLOZGZiYqH97RKTllOF3my1bQlavYC8iRZThd5O8Wf3kJOzZU//2iEhbUYbfDeJafdZgv3FjqNUr2Iv0BGX4nW5wEE6fzr6fsnqRnqOA36kKhTBWfVaagUqkZ6mk04mmprIH+3iwMwV7kZ6lgN9Jpqagry/7gGeTk3DmjHrgiPQ4lXQ6Rd6nZdXVUkQiCvidYGoqe7DXxCQiUkQlnXaXZ8z6yUkFexFZQhl+u5qago98BObn022/bBncfLPKNyJSVk0Zvpl9wMy+ZWbfNLNPmtmqxLr3mNnDZvaQmV1We1N7RKEA55wTsvq0wX7lSgV7Eamq1pLO54GXuvslwLeB9wCY2UbgSmATcDmwx8z6azxX94u7W546lW77wcFwU/b4cQV7EamqpoDv7ne5+5no7T3A+uj1FcDt7v68u38XeBh4ZS3n6npZa/WTk/D88wr0IpJaPW/aXgt8Nnq9Dngkse5w9NkSZrbDzA6Y2YEjR47UsTkdIO5Xb5Y+2JtpWAQRyaXqTVsz2w/8mxKrpt39r6NtpoEzQCFrA9x9L7AXYPPmzZ51/45UKMC116Yv3cRWrAg3cpXVi0gOVQO+u2+ptN7M3gr8EjDu7nHAfhS4MLHZ+ugzKRTgmmuyD3imScRFpEa19tK5HHgX8AZ3Tw7S8ingSjM7x8wuAi4GvlrLubq64V+DAAAGw0lEQVRCfFM2S7BfuTLcmFWwF5Ea1doP/38A5wCfNzOAe9x9p7vfb2Z3AA8QSj3vcPezNZ6rc+Up4ZjBzp2q1YtI3dQU8N39RRXW7QJ21XL8rpCnhDMyArt3q1YvInWlJ20bbXo6fbBfvhz+4i8U6EWkITSWTqMdOlR9m5GRUKc/eVLBXkQaRgG/ngoF2LAh9K3fsCG8Hx2tvM/kJBw9qkAvIg2ngF8vhQLs2AGzs2Fi8NnZ8H7rVhgYKL3P+LhuyopI0yjg18v09NLpA+fmYN8+uOmmULaJxSUcdbUUkSZSwM+rUIDVq0P3SbOQ0Zdy6FAo1xw9GjJ/d5VwRKQl1Esnjyz96qvV8EVEmkQBP6tCAbZvh7MpniMbHoZdehRBRNqDSjppxSWcbduqB3szGBuDvXtVuhGRtqEMP42pKfjwh0P9vZqxMTh4sOFNEhHJShl+NYVC+mA/MKASjoi0LQX8cuKHqLZtSxfsR0ZC90uVcESkTamkU0r8EFVxv/pShodVqxeRjqAMv5RSD1GVMjKiYC8iHUMBH5aOgVPuIapYPK+sHqASkQ6ikk5x+WZ2NgT0cnX7sbFwY1aBXkQ6jAJ+qfKN+9Kgr1q9iHQ4lXTKjVfvHrJ5PUQlIl1CGf7oaOmavR6gEpEuowx/165QrknSGDgi0oUU8CcmQrlG5RsR6XLdG/BLTTdYzsREKN/Mz4d/FexFpAt1Zw2/VFfLHTvCawVzEelR3ZXhJ8e/KTXd4PR0S5olItIOuifDTzP+TbkumCIiPaB7Mvw0499oukER6WHdE/CrZe/qaikiPa57An6l7F1dLUVEagv4ZvafzeybZnavmd1lZmujz83M/szMHo7Wv7w+za2g3ANUMzPqaikiQu0Z/gfc/RJ3fxnwGeAPos9fD1wcLTuAG2o8T3V6gEpEpKKaeum4+zOJtyuAeHjJK4Bb3d2Be8xslZld4O7fq+V8VU1MKMCLiJRRc7dMM9sFvAV4GviF6ON1wCOJzQ5Hny0J+Ga2g/BXAKPqRSMi0jBVSzpmtt/M7iuxXAHg7tPufiFQAH4zawPcfa+7b3b3zWvWrMl+BSIikkrVDN/dt6Q8VgHYB/wh8ChwYWLd+ugzERFpkVp76VyceHsF8K3o9aeAt0S9dX4GeLrh9XsREamo1hr+H5vZi4F5YBbYGX2+D9gKPAzMAdfUeB4REalRrb10/kOZzx14Ry3HFhGR+jJPTtTdYmZ2hPCXQhargaMNaE4z6RraQzdcA3THdegashlz96q9Xtoq4OdhZgfcfXOr21ELXUN76IZrgO64Dl1DY3TPWDoiIlKRAr6ISI/ohoC/t9UNqANdQ3vohmuA7rgOXUMDdHwNX0RE0umGDF9ERFJQwBcR6RFdEfDLTcTSSczsA2b2reg6Pmlmq1rdpqzM7E1mdr+ZzZtZW3VHq8bMLjezh6JJe97d6vbkYWY3mtnjZnZfq9uSh5ldaGZ/Z2YPRP8dXdfqNuVhZsvN7Ktm9k/Rdbyv1W2KdUUN38x+KB6b38x+G9jo7jur7NZWzOx1wN+6+xkzez+Au/9ei5uViZm9hDDMxkeA/+TuB1rcpFTMrB/4NvCLhKG8vwZc5e4PtLRhGZnZzwMnCHNRvLTV7cnKzC4ALnD3b5jZucDXgV/pwN+DASvc/YSZDQBfAq5z93ta3LTuyPArTMTSMdz9Lnc/E729hzDCaEdx9wfd/aFWtyOHVwIPu/u/uPsp4HbCYIAdxd2/CDzR6nbk5e7fc/dvRK+PAw8S5tHoKB6ciN4OREtbxKSuCPgQJmIxs0eACRamWuxU1wKfbXUjeki5CXukRcxsA/BTwFda25J8zKzfzO4FHgc+7+5tcR0dE/AbPRFLM1S7hmibaeAM4TraTpprEKmFma0E7gTeWfTXe8dw97PRXN/rgVeaWVuU2Gqe4rBZck7E0laqXYOZvRX4JWDc2/TmSobfQyfRhD1tIqp53wkU3P2vWt2eWrn7U2b2d8DlQMtvpndMhl9JhYlYOoaZXQ68C3iDu8+1uj095mvAxWZ2kZkNAlcSJvGRJopudn4UeNDdP9jq9uRlZmviXnZmNkToDNAWMalbeuncCSyaiMXdOypDM7OHgXOAY9FH93RgT6M3An8OrAGeAu5198ta26p0zGwr8KdAP3Cju+9qcZMyM7OPA68lDMv7r8AfuvtHW9qoDMzs1cDfA/9M+H8Z4L3uvq91rcrOzC4BbiH8t9QH3OHuf9TaVgVdEfBFRKS6rijpiIhIdQr4IiI9QgFfRKRHKOCLiPQIBXwRkR6hgC8i0iMU8EVEesT/B8lW0iPt1WnPAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "W0308 18:57:56.937305 4321252224 legend.py:1289] No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=> epoch  2: w_true= 3.00, w_pred= 7.59; b_true= 2.00, b_pred= -2.51, loss= 62.87\n",
      "=> epoch  3: w_true= 3.00, w_pred= 6.71; b_true= 2.00, b_pred= -1.62, loss= 41.23\n",
      "=> epoch  4: w_true= 3.00, w_pred= 6.00; b_true= 2.00, b_pred= -0.91, loss= 27.16\n",
      "=> epoch  5: w_true= 3.00, w_pred= 5.43; b_true= 2.00, b_pred= -0.33, loss= 18.02\n",
      "=> epoch  6: w_true= 3.00, w_pred= 4.96; b_true= 2.00, b_pred= 0.13, loss= 12.07\n",
      "=> epoch  7: w_true= 3.00, w_pred= 4.58; b_true= 2.00, b_pred= 0.49, loss= 8.20\n",
      "=> epoch  8: w_true= 3.00, w_pred= 4.28; b_true= 2.00, b_pred= 0.79, loss= 5.68\n",
      "=> epoch  9: w_true= 3.00, w_pred= 4.03; b_true= 2.00, b_pred= 1.03, loss= 4.05\n",
      "=> epoch 10: w_true= 3.00, w_pred= 3.83; b_true= 2.00, b_pred= 1.22, loss= 2.98\n",
      "=> epoch 11: w_true= 3.00, w_pred= 3.66; b_true= 2.00, b_pred= 1.37, loss= 2.29\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "W0308 18:57:58.325464 4321252224 legend.py:1289] No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=> epoch 12: w_true= 3.00, w_pred= 3.53; b_true= 2.00, b_pred= 1.49, loss= 1.84\n",
      "=> epoch 13: w_true= 3.00, w_pred= 3.42; b_true= 2.00, b_pred= 1.59, loss= 1.55\n",
      "=> epoch 14: w_true= 3.00, w_pred= 3.34; b_true= 2.00, b_pred= 1.67, loss= 1.36\n",
      "=> epoch 15: w_true= 3.00, w_pred= 3.27; b_true= 2.00, b_pred= 1.73, loss= 1.23\n",
      "=> epoch 16: w_true= 3.00, w_pred= 3.21; b_true= 2.00, b_pred= 1.78, loss= 1.15\n",
      "=> epoch 17: w_true= 3.00, w_pred= 3.16; b_true= 2.00, b_pred= 1.82, loss= 1.10\n",
      "=> epoch 18: w_true= 3.00, w_pred= 3.12; b_true= 2.00, b_pred= 1.85, loss= 1.06\n",
      "=> epoch 19: w_true= 3.00, w_pred= 3.09; b_true= 2.00, b_pred= 1.88, loss= 1.04\n",
      "=> epoch 20: w_true= 3.00, w_pred= 3.07; b_true= 2.00, b_pred= 1.90, loss= 1.03\n",
      "=> epoch 21: w_true= 3.00, w_pred= 3.05; b_true= 2.00, b_pred= 1.92, loss= 1.02\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=> epoch 22: w_true= 3.00, w_pred= 3.03; b_true= 2.00, b_pred= 1.93, loss= 1.01\n",
      "=> epoch 23: w_true= 3.00, w_pred= 3.02; b_true= 2.00, b_pred= 1.94, loss= 1.01\n",
      "=> epoch 24: w_true= 3.00, w_pred= 3.01; b_true= 2.00, b_pred= 1.95, loss= 1.00\n",
      "=> epoch 25: w_true= 3.00, w_pred= 3.00; b_true= 2.00, b_pred= 1.96, loss= 1.00\n",
      "=> epoch 26: w_true= 3.00, w_pred= 2.99; b_true= 2.00, b_pred= 1.96, loss= 1.00\n",
      "=> epoch 27: w_true= 3.00, w_pred= 2.99; b_true= 2.00, b_pred= 1.97, loss= 1.00\n",
      "=> epoch 28: w_true= 3.00, w_pred= 2.98; b_true= 2.00, b_pred= 1.97, loss= 1.00\n",
      "=> epoch 29: w_true= 3.00, w_pred= 2.98; b_true= 2.00, b_pred= 1.97, loss= 1.00\n",
      "=> epoch 30: w_true= 3.00, w_pred= 2.98; b_true= 2.00, b_pred= 1.98, loss= 1.00\n"
     ]
    }
   ],
   "source": [
    "# Define a training loop\n",
    "learning_rate = 0.1\n",
    "for epoch in range(30):\n",
    "    with tf.GradientTape() as tape:\n",
    "        loss = compute_loss(outputs, model(inputs))\n",
    "\n",
    "    dW, db = tape.gradient(loss, [model.W, model.b])\n",
    "\n",
    "    model.W.assign_sub(learning_rate * dW)\n",
    "    model.b.assign_sub(learning_rate * db)\n",
    "\n",
    "    print(\"=> epoch %2d: w_true= %.2f, w_pred= %.2f; b_true= %.2f, b_pred= %.2f, loss= %.2f\" %(\n",
    "          epoch+1, TRUE_W, model.W.numpy(), TRUE_b, model.b.numpy(), loss.numpy()))\n",
    "    if (epoch) % 10 == 0: plot(epoch + 1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
